package GUI;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.JButton;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
import javax.swing.JScrollPane;

import BaseDatos.BD;
import Codigo.PatronErrores;
import JSON.JSONException;
import JSON.JSONObject;

import java.awt.Color;

public class FrameMapaMesas extends JFrame {

	private JPanel contentPane;
	private JTable tablaEstadoMesa;
	private JTextField textoMesa;
	private JButton btnModificacinDeMesas;
	private JScrollPane scrollPane;
	private File file = new File("./fondo.jpg");
	private final int limiteCantidad=4;
	private BD baseDatos = new BD();
	private int numMesas;
	private ArrayList<JSONObject> lista;
	private ArrayList<JSONObject> facturas;
	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					FrameMapaMesas frame = new FrameMapaMesas();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 * @throws IOException 
	 */
	public FrameMapaMesas() throws IOException {
		
		BufferedImage tmpImagen=ImageIO.read(file); 
		bgBorder fondo = new bgBorder(tmpImagen);
		
		setTitle("Estado de Mesas");
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		setBounds(100, 100, 575, 448);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		///////Foto del Panel///////	
		contentPane.setBorder(fondo);
		
		
		JLabel lblEstadoDeLas = new JLabel("Estado de las Mesas");
		lblEstadoDeLas.setForeground(Color.WHITE);
		lblEstadoDeLas.setBounds(31, 27, 144, 14);
		contentPane.add(lblEstadoDeLas);
		
		scrollPane = new JScrollPane();
		scrollPane.setBounds(31, 52, 313, 336);
		contentPane.add(scrollPane);
		
		tablaEstadoMesa = new JTable();
		scrollPane.setViewportView(tablaEstadoMesa);
		tablaEstadoMesa.setModel(new DefaultTableModel(
			new Object[][] {
				{null, null},
				{null, null},
				{null, null},
				{null, null},
				{null, null},
				{null, null},
				{null, null},
				{null, null},
				{null, null},
				{null, null},
				{null, null},
				{null, null},
				{null, null},
				{null, null},
				{null, null},
				{null, null},
				{null, null},
				{null, null},
				{null, null},
				{null, null},
				{null, null},
			},
			new String[] {
					"Mesa", "Estado"
			}
		));
		
		JButton btnModificacinDeMesas = new JButton("Modificaci\u00F3n de Mesas");
		btnModificacinDeMesas.setBounds(371, 48, 169, 32);
		contentPane.add(btnModificacinDeMesas);
		
//////////////////////////////////////////TABLA DEL FRAME///////////////////////////////////////////
		numMesas=0;
		lista = baseDatos.listaMesas();
		if (lista != null)
		{
			calcularFilas(lista);
			for(int i=0;i<lista.size();i++)  
			{
				JSONObject mesai = lista.get(i);
				numMesas++;
				try {
					tablaEstadoMesa.setValueAt(mesai.getString("id"), i, 0);
						if (mesai.getString("libre").equals("1"))
						{
							tablaEstadoMesa.setValueAt("libre", i, 1);
						}
						else tablaEstadoMesa.setValueAt("ocupado",i,1);
         			}

				catch (JSONException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}		
			}
		}

		
		
		textoMesa = new JTextField();
		textoMesa.setBounds(371, 91, 169, 20);
		contentPane.add(textoMesa);
		textoMesa.setColumns(10);

		textoMesa.addKeyListener(new KeyListener(){
			
			public void keyTyped(KeyEvent e)
			
			{if (textoMesa.getText().length()== limiteCantidad)
			
			     e.consume();
			
			}
			public void keyPressed(KeyEvent arg0) {		}
			public void keyReleased(KeyEvent arg0) {	}
				});	
////////////////////////////////////////MODIFICA ESTADO MESA////////////////////////////////////////
		btnModificacinDeMesas.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
			     int mesa;
			     String numMesa = textoMesa.getText();
			     String ocupacionMesa="";
			     boolean enc=false;
			     
				try 
				{
					mesa = Integer.parseInt(numMesa);
					if (existeMesa(numMesa))
					{
							if (baseDatos.mesaOcupada(numMesa))
							{
								facturas=baseDatos.listaFacturas();
								if (facturas!=null){
								Iterator<JSONObject> it=facturas.iterator();
								while (it.hasNext()&&(!enc)){
									JSONObject factura= it.next();
									if(factura.getString("mesa").equals(textoMesa.getText())){
										    enc=true;
											if(factura.getString("cobrado").equals("1")){
												baseDatos.liberarMesa(numMesa);
												int i = recorridoTabla(tablaEstadoMesa,mesa);
												tablaEstadoMesa.setValueAt("libre", i, 1);
											}
											else PatronErrores.showMessage(47);
									}
								}
								
							}
							else
							{
								baseDatos.ocuparMesa(numMesa);
								int i = recorridoTabla(tablaEstadoMesa,mesa);
								tablaEstadoMesa.setValueAt("ocupada", i, 1);
							}
							}
							else 
								{PatronErrores.showMessage(49);}
					}
					else
					{
						PatronErrores.showMessage(9);
					}
				} 
				catch (NumberFormatException e1) 
				{
					// TODO Auto-generated catch block
					JOptionPane.showMessageDialog(null, "Datos introducidos incorrectamente");
				} catch (JSONException e2) {
					// TODO Auto-generated catch block
					e2.printStackTrace();
				}
			}
		});	
	}
	
	//Insertamos las filas que hagan necesarias en la tabla
		public void calcularFilas(ArrayList<JSONObject> listado){

			if (listado.size()>tablaEstadoMesa.getRowCount())
			{
			  int diferencia = listado.size()-tablaEstadoMesa.getRowCount();
		      for (int i = 0; i < diferencia; i++) {
		    	  ((DefaultTableModel) tablaEstadoMesa.getModel()).setRowCount(tablaEstadoMesa.getRowCount()+1);
				}
			}
		 }
		//Recorrido de la tabla
		public int recorridoTabla(JTable tabla,Integer nombreMesa)
		{
			boolean enc=false;
			int i=0;
			
			while(i<tabla.getRowCount() && !enc){
			        enc = (String.valueOf(nombreMesa).equals(tabla.getValueAt(i, 0)));       
			        i++;
			}
			if(enc) {return i-1;}
			   else  return -1;
		}
		
		//Consulta si la mesa existe en la base de datos.
		private boolean existeMesa(String id)
		{
			boolean existe = false;
			lista = baseDatos.listaMesas();
			if (lista == null) return false;
			Iterator<JSONObject> it = lista.iterator();
			while (!existe && it.hasNext())
			{
				JSONObject aux = it.next();
				try {
					if (aux.getString("id").equals(id)) existe = true;
				} catch (JSONException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			return existe;
		}

}


